package com.xherorlclass.core;

/**
 * @author ：Xherorl
 * @date ：Created in 2023/9/1 14:05
 * @description：
 */
public class XherorlrpcShutdownHook extends Thread{
    @Override
    public void run() {
        // 1、打开挡板  （boolean 需要线程安全）
        ShutDownHolder.BAFFLE.set(true);

        // 2、等待计数器归零（正常的请求处理结束）  可以用AtomicInteger
        //        // 等待归零，继续执行  countdownLatch, 最多等十秒
        long start = System.currentTimeMillis();
        while (true){
            try {
                Thread.sleep(100);
            }catch (InterruptedException e){
                throw new RuntimeException(e);
            }
            if (ShutDownHolder.REQUEST_COUNTER.sum() == 0L || System.currentTimeMillis()-start > 10000){
                break;
            }
        }
        // 3、阻塞结束后，放行。执行其他操作，比如释放资源
    }
}

/*
* `CountDownLatch`是Java中的一个并发工具类，用于控制线程的执行顺序和协调多个线程之间的同步操作。它可以让一个或多个线程等待其他线程完成一组操作后再继续执行。
`CountDownLatch`的主要方法是`await()`和`countDown()`：
- `await()`方法：调用该方法的线程会被阻塞，直到计数器减到零，即所有的`countDown()`方法都被调用，才会继续执行。
- `countDown()`方法：每次调用该方法，计数器就会减1。当计数器减到零时，之前调用`await()`方法的线程会被唤醒继续执行。
下面是一些`CountDownLatch`的具体应用场景：
1. 控制主线程等待子线程完成：主线程可以使用`CountDownLatch`等待多个子线程执行完毕后再继续执行，这样可以保证主线程在所有子线程完成后再进行下一步操作。
2. 并行任务的统计：当有多个并行任务需要执行，每个任务完成后需要对结果进行统计，可以使用`CountDownLatch`来等待所有任务执行完毕，然后进行结果的汇总。
3. 多线程并发测试：在进行多线程并发测试时，可以使用`CountDownLatch`来控制线程的启动和停止，以确保测试线程在同一时间开始执行，同时等待测试线程全部执行完毕进行结果的验证。
4. 等待资源初始化完成：当有多个资源需要初始化，某些任务依赖于这些资源进行操作时，可以使用`CountDownLatch`来等待所有资源初始化完成后再执行依赖任务。
总之，`CountDownLatch`是一个实用的并发工具，用于控制线程的等待和同步。通过合理地使用`CountDownLatch`，可以实现线程间的顺序控制、同步协作，提高并发程序的效率和可靠性。
*
* */
